﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using BusinessLogic;
using System.Data;

namespace Presentation.contenido
{
    public partial class entradaSoporte : System.Web.UI.Page
    {

        protected void Page_Load(object sender, EventArgs e)
        {
            if (!IsPostBack)
            {
                //Se carga el GridView de tickets sin asignar.
                gvSinAsignar.DataSource = Sistema.getInstancia().getSolicitudesSinAsignar();
                gvSinAsignar.DataBind();

                //Se carga el GridView de tickets asignados.
                //Si el funcionario logueado es un supervisor, se cargan todas las solicitudes asignadas,
                //si no, se cargan las solicitudes especificas del tecnico.
                if (Session["RolFunc"].ToString() == "Supervisor")
                {
                    gvAsignados.DataSource = Sistema.getInstancia().getSolicitudesAsignadas();
                    gvAsignados.DataBind();
                }
                else if (Session["RolFunc"].ToString() == "Tecnico")
                {
                    gvAsignados.DataSource = Sistema.getInstancia().getSolAsigListByNroTec(long.Parse(Session["NroFunc"].ToString()));
                    gvAsignados.DataBind();
                }
                

                //Se hacen invisibles todos los views con informacion de los ticket.

                //Detalles del ticket:
                mvSelTicket.ActiveViewIndex = -1;
                //Boton "Cancelar":
                mvCancelar.ActiveViewIndex = -1;
                //view Comentarios:
                mvComentarios.ActiveViewIndex = -1;
                //Opciones de Tecnico o Supervisor:
                mvAbajo.ActiveViewIndex = -1;

                //Si el funcionario logueado es un Supervisor, se carga el DropDownList de Tecnicos.
                if(Session["RolFunc"].ToString() == "Supervisor")
                {
                    loadDdlTecnicos();
                }
            }
        }

        protected void gvSinAsignar_SelectedIndexChanged(object sender, EventArgs e)
        {
            //Se activa el view de los detalles del ticket seleccionado.
            mvSelTicket.ActiveViewIndex = 0;
            //Se hace visible el view que contiene el boton "Cancelar".
            mvCancelar.ActiveViewIndex = 0;
            //Si el funcionario logueado es un supervisor, se activa el view que contiene un DropDownList con una lista de tecnicos disponibles
            //para asignar a una solicitud.
            if(Session["RolFunc"].ToString() == "Supervisor")
            {
                mvAbajo.ActiveViewIndex = 1;
            }
            else if(Session["RolFunc"].ToString() == "Tecnico")
            {
                //Si el funcionario logueado es un Tecnico, se activa el view que contiene el boton "Tomar la solicitud".
                mvAbajo.ActiveViewIndex = 0;
            }

            //Se obtiene la solicitud correspondiente al numero de ticket seleccionado.
            Solicitud sol = Sistema.getInstancia().getSolicitudByNro(long.Parse(gvSinAsignar.SelectedRow.Cells[0].Text));
            //Se le asignan los datos de la solicitud a la view de los detalles.
            lblUsuario.Text = sol.UnUsuario.Nombre;
            lblMailUsuario.Text = sol.UnUsuario.Mail;
            lblTelUsuario.Text = sol.UnUsuario.Telefono;
            lblInterno.Text = sol.UnUsuario.Interno;
            lblNroTicket.Text = sol.NroTicket.ToString();
            lblFechaCreado.Text = sol.Creada.ToShortDateString();
            lblFechaCerrado.Text = sol.Cerrada.ToString() != "" ? sol.Cerrada.ToShortDateString() : "Ninguna";
            lblEstado.Text = sol.Estado.ToString();
            lblTecnico.Text = sol.UnTecnico != null ? sol.UnTecnico.Nombre : "Ninguno";
            lblAsunto.Text = sol.Asunto;
            lblDesc.Text = sol.Descripcion;
        }

        protected void btnTomar_Click(object sender, EventArgs e)
        {
            //Se verifica que haya una solicitud seleccionada.
            if(lblNroTicket.Text != "")
            {
                //Se parsea el numero de ticket seleccionado.
                long nroTicket = long.Parse(lblNroTicket.Text);
                //Se parsea el numero de funcionario del tecnico que esta logueado en el sistema.
                long nroTec = long.Parse(Session["NroFunc"].ToString());
                
                //Se asigna el tecnico a la solicitud.
                Sistema.getInstancia().setTecnicoToSolicitud(nroTec, nroTicket);

                //Se recarga la pagina para refrescar las listas de solicitudes con los cambios realizados.
                Response.Redirect("entradaSoporte.aspx");
            }
        }

        protected void gvAsignados_SelectedIndexChanged(object sender, EventArgs e)
        {
            //Se activa el view de los detalles del ticket seleccionado.
            mvSelTicket.ActiveViewIndex = 0;
            //Se hace visible el view que contiene el boton "Cancelar".
            mvCancelar.ActiveViewIndex = 0;
            //Se hace invisible el view que contiene el boton "Tomar solicitud" en el caso del tecnico, 
            //o el dropdownlist de tecnicos en el caso del supervisor.
            mvAbajo.ActiveViewIndex = -1;
            //Se obtiene la solicitud correspondiente al numero de ticket seleccionado.
            Solicitud sol = Sistema.getInstancia().getSolicitudByNro(long.Parse(gvAsignados.SelectedRow.Cells[0].Text));
            //Se le asignan los datos de la solicitud a la view de los detalles.
            lblUsuario.Text = sol.UnUsuario.Nombre;
            lblMailUsuario.Text = sol.UnUsuario.Mail;
            lblTelUsuario.Text = sol.UnUsuario.Telefono;
            lblInterno.Text = sol.UnUsuario.Interno;
            lblNroTicket.Text = sol.NroTicket.ToString();
            lblFechaCreado.Text = sol.Creada.ToShortDateString();
            lblFechaCerrado.Text = sol.Cerrada.ToString() != "" ? sol.Cerrada.ToShortDateString() : "Ninguna";
            lblEstado.Text = sol.Estado.ToString();
            lblTecnico.Text = sol.UnTecnico != null ? sol.UnTecnico.Nombre : "Ninguno";
            lblAsunto.Text = sol.Asunto;
            lblDesc.Text = sol.Descripcion;
            //Se cargan en la variable de session LstMensajes si los hay, los comentarios relacionados a la solicitud.
            Session["LstMens"] = sol.LstMensajes;
            //Si la lista de mensajes no esta vacia, se habilita el view de comentarios,
            //Se limpia el formulario de comentarios y respuestas,
            //y se carga el panel con el mensaje mas reciente.
            if (Session["LstMens"] != null)
            {
                mvComentarios.ActiveViewIndex = 0;
                //Se carga la variable de session UnMens con el ultimo elemento de la lista de mensajes.
                Session["UnMens"] = ((List<Mensaje>)Session["LstMens"])[((List<Mensaje>)Session["LstMens"]).Count() - 1];
                fillFormComentarios();
            }
        }

        protected void ddlTecnicos_SelectedIndexChanged(object sender, EventArgs e)
        {
           
        }

        //cargar el DropDownList ddlTecnicos.
        public void loadDdlTecnicos()
        {
            ddlTecnicos.Items.Clear(); // Borra el contenido de la lista de tecnicos disponibles.
            ListItem unL = new ListItem("Elija un Tecnico...", "" + 0);
            ddlTecnicos.Items.Add(unL);
            //Recibe la lista de tecnicos disponibles.
            DataTable dt = Sistema.getInstancia().getTecListAndCantSol();
            foreach ( DataRow row in dt.Rows)
            {
                ListItem l = new ListItem(row[1] + " (" + row[2] + ")", row[0].ToString());
                ddlTecnicos.Items.Add(l);
            }
            ddlTecnicos.SelectedIndex = 0;
        }

        protected void btnAsignar_Click(object sender, EventArgs e)
        {
            //Si hay un ticket y un tecnico seleccionados.
            if (lblNroTicket.Text != "" && ddlTecnicos.SelectedValue != "0")
            {
                //Se parsean a long los numeros del ticket y del tecnico seleccionado que se quiere asignar al mismo.
                long pNroTicket = long.Parse(lblNroTicket.Text);
                long pNroTec = long.Parse(ddlTecnicos.SelectedValue);
                //Se asigna el tecnico a la solicitud.
                Sistema.getInstancia().setTecnicoToSolicitud(pNroTec, pNroTicket);
                //Se refresca la pagina para reflejar los cambios realizados en las listas.
                Response.Redirect("entradaSoporte.aspx");
            }
        }
        
        protected void btnCancelar_Click(object sender, EventArgs e)
        {
            if(lblNroTicket.Text != "")
            {
                //Se cambia el estado del ticket a "Cancelado".
                Sistema.getInstancia().setEstadoSolicitud(enEstado.Cancelado, long.Parse(lblNroTicket.Text));
                //Se refresca la pagina para reflejar los cambios en las listas.
                Response.Redirect("entradaSoporte.aspx");
            }
        }

        protected void btnAnterior_Click(object sender, EventArgs e)
        {
            int indice = ((List<Mensaje>)Session["LstMens"]).IndexOf((Mensaje)Session["UnMens"]);
            //Se controla que haya un comentario anterior

            if (indice > 0)
            {
                //La lista de mensajes almacenada esta ordenada por fecha en orden descendente,
                //por lo que para ir a un comentario posterior se retrocede en vez de avanzar.
                Session["UnMens"] = ((List<Mensaje>)Session["LstMens"])[indice - 1];
                fillFormComentarios();
            }
        }

        protected void btnSiguiente_Click(object sender, EventArgs e)
        {
            int indice = ((List<Mensaje>)Session["LstMens"]).IndexOf((Mensaje)Session["UnMens"]);
            //Se controla que haya un comentario siguiente.
            if (indice < (((List<Mensaje>)Session["LstMens"]).Count() - 1))
            {
                //La lista de mensajes almacenada esta ordenada por fecha en orden descendente,
                //por lo que para ir a un comentario anterior se avanza en vez de retroceder.
                Session["UnMens"] = ((List<Mensaje>)Session["LstMens"])[indice + 1];
                fillFormComentarios();
            }
        }
        private void fillFormComentarios()
        {
            //Se limpia el formulario de comentarios y respuestas.
            limpiarForm();
            //Se hace visible
            pComentarios.Visible = true;

            Mensaje unM = (Mensaje)Session["UnMens"];
            //Llena el formulario con los datos de un objeto Mensaje que se recibe como parametro.
            lblNumCom.Text = (((List<Mensaje>)Session["LstMens"]).Count() - ((List<Mensaje>)Session["LstMens"]).IndexOf(unM)).ToString();
            lblTotCom.Text = ((List<Mensaje>)Session["LstMens"]).Count().ToString();
            lblComFecha.Text = unM.Fecha.ToShortDateString();
            lblComentario.Text = unM.Texto;
            //Se habilitan o deshabilitan los botones de Anterior y Siguiente, segun la disponibilidad de mas comentarios.
            setEnabledSigAnt();
            //Se crea una lista de tipo respuesta y se intenta llenar con respuestas relacionadas con el mensaje.
            List<Respuesta> lstRespuestas = Respuesta.getRespuestaByNroMensaje(unM.Id);
            if (lstRespuestas != null)
            {
                fillFormRespuesta(lstRespuestas[0]);
            }
            else
            {
                //En caso de que no haya respuestas para el comentario actual, se hace invisible el panel pConRespuesta.
                pConRespuesta.Visible = false;
            }
        }

        private void fillFormRespuesta(Respuesta pRes)
        {
            //Se hace visible el panel de respuestas.
            pConRespuesta.Visible = true;
            //Llena el formulario de respuesta con los dato de un objeto Respuesta que recibe como parametro.
            lblResFecha.Text = pRes.Fecha.ToShortDateString();
            lblRespuesta.Text = pRes.Texto;
        }
        private void limpiarForm()
        {
            //Limpia el formulario de preguntas.
            lblNumCom.Text = "";
            lblTotCom.Text = "";
            lblComFecha.Text = "";
            lblComentario.Text = "";
            //Limpiar el formulario de respuestas.
            lblResFecha.Text = "";
            lblRespuesta.Text = "";
        }

        //Habilita o deshabilita los botones de anterior y siguiente.
        protected void setEnabledSigAnt()
        {
            //Se declara una lista de mensajes y se le asigna un parseo de la que se encuentra en la variable de session.
            List<Mensaje> lstMensajes = ((List<Mensaje>)Session["LstMens"]);
            Mensaje unMens = (Mensaje)Session["UnMens"];
            int indice = lstMensajes.IndexOf(unMens);
            //Si la lista de mensajes solo contiene un mensaje, se deshabilitan ambos botones.
            //RECORDAR QUE LA LISTA DE MENSAJES ESTA ORDENADA POR FECHA EN ORDEN DESCENDIENTE, POR LO QUE EL PRIMER ITEM DE LA LISTA
            //SERA EL MAS RECIENTE Y EL ULTIMO, EL MAS ANTIGUO.
            if (lstMensajes.Count() == 1)
            {
                //Si hay solo un comentario, se anulan ambos botones.
                btnSiguiente.Enabled = false;
                btnAnterior.Enabled = false;
            }
            else if (indice < (lstMensajes.Count() - 1) && indice > 0)
            {
                //Si existe tanto un anterior como un posterior, se habilitan ambos botones.
                btnAnterior.Enabled = true;
                btnSiguiente.Enabled = true;
            }
            else if (indice == (lstMensajes.Count() - 1))
            {
                btnAnterior.Enabled = true;
                btnSiguiente.Enabled = false;
            }
            else if (indice == 0 && lstMensajes.Count() > 1)
            {
                btnSiguiente.Enabled = true;
                btnAnterior.Enabled = false;
            }

        }
    }
}